package com.chhuang.utils.config;

import java.io.IOException;
import java.util.List;

import org.apache.commons.configuration.Configuration;
import org.apache.commons.configuration.ConfigurationException;
import org.apache.commons.configuration.PropertiesConfiguration;
import org.apache.commons.lang3.StringUtils;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
/**
 * 
* @ClassName: SysConfig 
* @Description: TODO 
* @author: 黄晨 
* @date: 2015-3-25
*
 */
public class SysConfig {
	
	private static Configuration config;
	
	/** 配置文件路径  */
	private static String MNOC_CONFIG_FILE = "config/sysConfig.properties";
	/** 是否自动加载 */
	private static boolean autoLoad = true;
	/** 最后修改时间 */
	private static long lastModified;
	
	/** 初始化props */
	static {
		init();
	}
	
	/**
	 * 初始化配置文件；
	 * 如果多个配置文件，则修改，加入map管理。
	 */
	private static void init() {
		try {
			config = new PropertiesConfiguration(MNOC_CONFIG_FILE);
			if(autoLoad) {
				lastModified = getLastModified();
			}
		} catch (ConfigurationException e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * 手动初始化配置文件，设置配置文件修改后是否自动加载和配置文件地址，默认地址为：config/sysConfig.properties
	 * @param autoLoadAfterFileModified
	 * @param configFilePath
	 */
	public static void init(boolean autoLoadAfterFileModified, String configFilePath){
		MNOC_CONFIG_FILE = configFilePath;
		autoLoad = autoLoadAfterFileModified;
		init();
	}
	
	/**
	 * 判断是否需要重新加载文件
	 */
	public static void reInit(){
		if(config == null || (autoLoad && lastModified != getLastModified())) {
			init();
		}
	}
	
	/**
	 * 得到String类型的值
	 * @param key
	 * @return
	 */
	public static String getValue(String key) {
		reInit();
		return config.getString(key);
	}
	
	/**
	 * 得到文件保存路径
	 * @param key
	 * @return
	 */
	public static String getPath(String key) {
		String path = getValue(key);
		if(StringUtils.isNotBlank(path)){
			return path.endsWith("/") ? path : path+"/";
		}else{
			return null;
		}
	}
	
	/**
	 * 得到int类型的值
	 * @param key
	 * @param def 默认值
	 * @return
	 */
	public static Integer getInt(String key, int def){
		reInit();
		return config.getInt(key, def);
	}
	
	/**
	 * 得到long类型的值
	 * @param key
	 * @param def 默认值
	 * @return
	 */
	public static Long getLong(String key, long def){
		reInit();
		return config.getLong(key, def);
	}
	
	/**
	 * 得到float类型的值
	 * @param key
	 * @param def
	 * @return
	 */
	public static float getFloat(String key, float def) {
		reInit();  
        return config.getFloat(key, def);  
    }   
	
	/**
	 * 得到double类型的值
	 * @param key
	 * @param def
	 * @return
	 */
    public static double getDouble(String key, double def) {
		reInit(); 
        return config.getDouble(key, def);  
    }  
    
    /**
	 * 得到boolean类型的值
	 * @param key
	 * @param def
	 * @return
	 */
    public static boolean getBoolean(String key, boolean def) {
		reInit(); 
        return config.getBoolean(key, def);  
    }  
    
    /**
     * 得到String[]类型的值
     * @param key
     * @return
     */
    public static String[] getStringArray(String key) {
		reInit(); 
        return config.getStringArray(key);  
    }  
    
    public static List<?> getList(String key) {
		reInit();
        return config.getList(key);
    }
  
    public static void setProperty(String key, Object value) {  
        config.setProperty(key, value);
    }
    
	/**
	 * 获得文件最后修改时间
	 * @return
	 */
	private static long getLastModified() {
		long lastModifiedTime = 0l;
		Resource res = new ClassPathResource(MNOC_CONFIG_FILE);
		
		try {
			lastModifiedTime = res.getFile().lastModified();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return lastModifiedTime;
	}
}
